import { Controller, Get, Inject, Post, Query } from '@nestjs/common';


import MiniProgram from 'node-easywechat/dist/MiniProgram/Application';
import { PayService } from '../service/pay.service';
import Payment from 'node-easywechat/dist/Payment/Application';
import * as Utils from 'node-easywechat/dist/Core/Utils'
import dayjs from 'dayjs';
import { JsonApiResponse } from '@utils/json.api.response';
import OfficialAccount from 'node-easywechat/dist/OfficialAccount/Application';
import { WeixinService } from '../service/weixin.service';
import { randomInt } from 'crypto';
import stringRandom from 'string-random';

@Controller('order')
export class OrderController {
    constructor(
        @Inject(PayService) 
        private readonly payService : PayService,
        @Inject(WeixinService) 
        private readonly weixinService : WeixinService
    ){
        
    }

    @Get('add_new')
    async addNewMessage()
    {
        // this.weixinService.officialAccount.getClient().httpPostJson('https://api.weixin.qq.com/cgi-bin/material/add_news',{
        //     "articles":[{
        //         "title": '测试文章',
        //         "thumb_media_id": 'me',
        //         "author": AUTHOR, "digest" : DIGEST,
        //         "show_cover_pic": SHOW_COVER_PIC（0/1）,
        //         "content" : CONTENT,
        //         "content_source_url": CONTENT_SOURCE_URL,
        //         "need_open_comment" : NEED_OPEN_COMMENT（0/1）,
        //         "only_fans_can_comment" : ONLY_FANS_CAN_COMMENT（0/1） }]
        //         //若新增的是多图文素材，则此处应有几段articles结构，最多8段 
        // })
    }

    @Get('ticket')
    async ticket(){
        const app = this.weixinService.officialAccount
        const config = await app.jssdk.buildConfig([
            'updateAppMessageShareData',
            'updateTimelineShareData',
            'onMenuShareTimeline'
        ],true,true,true,[],'http://www.apesk.net/h5/#/')
        //const access_token = await app.access_token
        //const res = await app.getClient().httpGet('https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi')
    
        return JsonApiResponse.object(JSON.parse(config))
    }

    @Get('wxopenurl')
    async wxOpenUrl(){
        const app = new MiniProgram({
            // 配置项
            'app_id' : 'wx7075f04edc923e5b',
            'secret' : '6de604c134d247e678fecbd9b7d814af'
        })

        const res = await app.app_code.httpPostJson('https://api.weixin.qq.com/wxa/generatescheme',{});
    
        return JsonApiResponse.new(res)
    }

    async order(@Query('code') code){

        const app = new MiniProgram({
            // 配置项
            'app_id' : 'wx7075f04edc923e5b',
            'secret' : '6de604c134d247e678fecbd9b7d814af'
        })

        const session = await app.auth.session(code)

        const out_trade_no = dayjs().format('YYYYMMDDHHmmss') + stringRandom(5,{numbers:true})

        //调用接口创建一个预支付订单,签名发给客户端
        const pre_order = await this.payService.payClient.order.unify({
            // appid: config.appid, // 小程序id  - EasyWechat 不用填
            // mch_id: config.mch_id, // 商户id   - EasyWechat 不用填
            // nonce_str: service.wx.randomStr(), // 自定义生成随机字符方法 - EasyWechat 不用填
            // sign_type: "MD5", // 加密类型 - EasyWechat 不用填
            // sign - EasyWechat 不用填
  
            body : '腾讯充值中心-QQ会员充值2', // 商品简单描述，有格式要求
            out_trade_no: out_trade_no,//'20150806125353', // 订单号
            total_fee : 1, // 单位：分
            spbill_create_ip: '134.175.224.228', // 可选，如不传该参数，SDK 将会自动获取相应 IP 地址, 服务器ip
            notify_url: "http://www.apesk.net/api/common/wxpay/callback/notify", // 支付成功通知地址// 支付结果通知网址，如果不设置则会使用配置里的默认地址
            trade_type: "JSAPI", // 支付方式（小程序支付选JSAPI）// 请对应换成你的支付方式对应的值类型
            openid: session.openid //'ogCCq5UfBCHxriyn99dOYjD95v9A', // 用户openid，步骤0保存的数据
          });

          //这里应该保存预支付订单
          // ... ...

          //预支付订单二次签名
          let secretKey =  await this.payService.payClient.config.key;

          let  paramters = {
            "appId" : app.config.app_id,
            "timeStamp": dayjs().unix().toString(), // 时间戳 (单位：秒)
            "nonceStr": Utils.randomString(32), // 随机字符串
            "package": `prepay_id=${pre_order.prepay_id}`,//`prepay_id=${pre_order.prepay_id}`,        // 固定值
            "signType" : "MD5",
          }

          paramters['paySign'] = Utils.makeSignature(paramters,secretKey,paramters['sign_type'] || 'MD5');
 
          return JsonApiResponse.new(paramters)
    }

}
